package velha.connection.bt;

import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;
import javax.microedition.lcdui.*;
import velha.VelhaMIDlet;

public class GUICliente implements CommandListener, Runnable {

    private final Command COMANDO_BUSCAR = new Command("Buscar", Command.OK, 0);
    private final Command BUSCA_COMANDO_CANCELAR = new Command("Cancelar", Command.CANCEL, 1);
    private final Command CONECTANDO_COMANDO_CANCELAR = new Command("Cancelar", Command.CANCEL, 1);
    private final Command COMANDO_VOLTAR = new Command("Voltar", Command.BACK, 2);
    //Tela principar para a parte do cliente.
    private final Form telaPrincipal = new Form("Jogo da Velha");
    //Tela com dispositivos encontrados.
    private final List telaJogos = new List("Jogo da Velha", List.IMPLICIT);
    //Objeto que faz o processo real
    private BTCliente bt_cliente;
    //
    public final VelhaMIDlet midlet;

    public GUICliente(VelhaMIDlet midlet) {
        new Thread(this).start();

        this.midlet = midlet;
        
        telaPrincipal.addCommand(COMANDO_BUSCAR);
        telaPrincipal.addCommand(COMANDO_VOLTAR);
        telaPrincipal.setCommandListener(this);

        telaJogos.addCommand(COMANDO_VOLTAR);
        telaJogos.setCommandListener(this);
    }

    public void completeInitialization(boolean isBTReady) {
        // bluetooth was initialized successfully.
        if (isBTReady) {
            StringItem si = new StringItem("Procurar jogos !", null);
            si.setLayout(StringItem.LAYOUT_CENTER | StringItem.LAYOUT_VCENTER);
            telaPrincipal.append(si);
            midlet.getDisplay().setCurrent(telaPrincipal);

            return;
        }

        // something wrong
        Alert al = new Alert("Erro", "Falha ao inicializar bluetooth", null, AlertType.ERROR);
        al.setTimeout(Alert.FOREVER);
        midlet.getDisplay().setCurrent(al);
    }

    public void commandAction(Command c, Displayable d) {

        if (c == BUSCA_COMANDO_CANCELAR) {
            bt_cliente.cancelaBusca();
            midlet.getDisplay().setCurrent(telaPrincipal);

            return;
        }

        if (c == CONECTANDO_COMANDO_CANCELAR) {
            bt_cliente.cancelaConexao();
            midlet.getDisplay().setCurrent(telaJogos);
            return;
        }

        if (d == telaPrincipal) {
            if (c == COMANDO_BUSCAR) {
                Form busca = new Form("Buscando...");
                busca.addCommand(BUSCA_COMANDO_CANCELAR);
                busca.setCommandListener(this);
                busca.append(new Gauge("Procurando jogos...", false, Gauge.INDEFINITE, Gauge.CONTINUOUS_RUNNING));

                midlet.getDisplay().setCurrent(busca);

                bt_cliente.iniciaBusca();
            } else if (c == COMANDO_VOLTAR) {
                destroy();
                midlet.getDisplay().setCurrent(new BTMenu(midlet));
            }
        } else if (d == telaJogos) {
            if (c == COMANDO_VOLTAR) {
                midlet.getDisplay().setCurrent(telaPrincipal);
            } else if (c == List.SELECT_COMMAND) {
                Form conecta = new Form("Conectando...");
                conecta.addCommand(CONECTANDO_COMANDO_CANCELAR);
                conecta.setCommandListener(this);
                conecta.append(new Gauge("Conectando...", false, Gauge.INDEFINITE, Gauge.CONTINUOUS_RUNNING));
                midlet.getDisplay().setCurrent(conecta);

                bt_cliente.conecta(telaJogos.getSelectedIndex());
            }
        }
    }

    private void destroy() {
        bt_cliente.destroy();
    }

    public void informSearchError(String cant_start_device_search) {
        Alert alerta = new Alert("Erro", cant_start_device_search, null, AlertType.ERROR);
        alerta.setTimeout(Alert.FOREVER);
        midlet.getDisplay().setCurrent(alerta, telaPrincipal);
    }

    public void exibeJogos(Vector records) {
        telaJogos.deleteAll();

        Image phoneImg = null;

        try {
            phoneImg = Image.createImage("/img/phone.png");
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        Enumeration e = records.elements();

        while (e.hasMoreElements()) {
            ServiceRecord sr = (ServiceRecord) e.nextElement();
            RemoteDevice dispoistivo = sr.getHostDevice();

            try {
                telaJogos.append(dispoistivo.getFriendlyName(true), phoneImg);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        midlet.getDisplay().setCurrent(telaJogos);
    }

    public void run() {
        bt_cliente = new BTCliente(this);
    }
}
